//package com.ikas.autumn.iec104.common.util;
//
//import lombok.extern.slf4j.Slf4j;
//import org.redisson.api.RLock;
//import org.redisson.api.RedissonClient;
//import org.springframework.data.redis.core.*;
//
//import java.util.*;
//import java.util.concurrent.TimeUnit;
//import java.util.function.Function;
//import java.util.stream.Collectors;
//
///***
// * Simply Redis Util - Don't be new
// */
//@Slf4j
//public class RedisUtil {
//
//    private RedisUtil() {
//    }
//
//
//    private static RedissonClient redisson;
//    private static RedisTemplate<String, Object> redis;
//    private static ValueOperations<String, Object> string;
//    private static HashOperations<String, String, Object> hash;
//    private static ListOperations<String, Object> list;
//    private static SetOperations<String, Object> set;
//    private static ZSetOperations<String, Object> zset;
//
//    /**
//     * 初始化参数
//     * @param redis
//     */
//    public static void setRedis(RedisTemplate<String, Object> redis) {
//        RedisUtil.redis = redis;
//        RedisUtil.string = redis.opsForValue();
//        RedisUtil.hash = redis.opsForHash();
//        RedisUtil.list = redis.opsForList();
//        RedisUtil.set = redis.opsForSet();
//        RedisUtil.zset = redis.opsForZSet();
//    }
//
//    public static void setRedisson(RedissonClient redisson) {
//        RedisUtil.redisson = redisson;
//    }
//
//    /**
//     * 消息发布
//     * @param channel
//     * @param message
//     */
//    public static void convertAndSend(String channel, Object message){
//        redis.convertAndSend(channel,message);
//    }
//
//    private static <T> T ifNumber(Class<T> t, Object value) {
//        if (t == Double.class) {
//            return (T) Double.valueOf(value.toString());
//        }
//        if (t == Long.class) {
//            return (T) Long.valueOf(value.toString());
//        }
//        if (t == Integer.class) {
//            return (T) Integer.valueOf(value.toString());
//        }
//        if (t == Float.class) {
//            return (T) Float.valueOf(value.toString());
//        }
//        return (T) value;
//    }
//
//    /**
//     * 获取redis保存的值
//     * @param key key
//     * @return T 泛型值，强转可能失败
//     * @author admin
//     */
//    public static <T> T get(String key) {
//        Object value = string.get(key);
//        return value == null ? null : (T) value;
//    }
//
//    /**
//     * 获取redis保存的值
//     * @param key key
//     * @return T 泛型值，强转可能失败
//     * @author admin
//     */
//    public static Long getLong(String key) {
//        Object value = string.get(key);
//        return value == null ? null : value instanceof Integer ? ((Integer) value).longValue() : (Long) value;
//    }
//
//    /**
//     * 设置有过期时间的key
//     * @param key   key
//     * @param value value
//     * @author admin
//     */
//    public static <T> void set(String key, T value) {
//        string.set(key, value);
//    }
//
//    /**
//     * 设置有过期时间的key
//     * @param key    key
//     * @param value  value
//     * @param expire expire
//     * @author admin
//     */
//    public static <T> void set(String key, T value, long expire) {
//        string.set(key, value, expire, TimeUnit.SECONDS);
//    }
//
//    /**
//     * 设置有过期时间的key
//     * @param key    key
//     * @param value  value
//     * @param expire expire
//     * @param unit   timeUnit
//     * @author admin
//     */
//    public static <T> void set(String key, T value, long expire, TimeUnit unit) {
//        string.set(key, value, expire, unit);
//    }
//
//    /**
//     * 设置有过期时间的key
//     *
//     * @param key   key
//     * @param value value
//     * @author admin
//     */
//    public static <T> void setIfPresent(String key, T value) {
//        string.setIfPresent(key, value);
//    }
//
//    /**
//     * 删除redis中的key
//     *
//     * @param keys keys
//     * @author admin
//     */
//    public static void del(String... keys) {
//        if (keys == null || keys.length < 1) {
//            return;
//        }
//        java.util.Set<String> stringSet = Arrays.stream(keys).collect(Collectors.toSet());
//        redis.delete(stringSet);
//    }
//
//    /**
//     * 删除redis中的key
//     * @param keys keys
//     * @author admin
//     */
//    public static void del(Collection<String> keys) {
//        if (keys == null || keys.isEmpty()) {
//            return;
//        }
//        redis.delete(keys);
//    }
//
//    /**
//     * 自增操作
//     *
//     * @param key key
//     * @return long 自增后的值
//     * @author admin
//     */
//    public static long inc(String key) {
//        return inc(key, 1);
//    }
//
//    /**
//     * 自增操作
//     *
//     * @param key key
//     * @return long 自增后的值
//     * @author admin
//     */
//    public static long inc(String key, long inc) {
//        return Optional.ofNullable(string.increment(key, inc)).orElse(0L);
//    }
//
//    /**
//     * Lock operation - 锁操作
//     */
//    public static abstract class Lock {
//        private Lock() {
//        }
//
//        /**
//         * 获取锁
//         *
//         * @param key key
//         */
//        public static RLock get(String key) {
//            return redisson.getLock(key);
//        }
//
//        /**
//         * 加锁方法 --- Double check
//         *
//         * @param key    key
//         * @param test   判断函数, 返回null表示需加锁
//         * @param ifLock 需要加锁的操作函数, 执行点为判断失败如果加锁成功后又判断失败，则执行函数后返回
//         * @param value  需要加锁的值
//         * @return R is nullable
//         */
//        public static <T, R> R lockIf(String key, Function<T, R> test, Function<T, R> ifLock, T value) {
//            // first check
//            R result = test.apply(value);
//            if (result != null) {
//                return result;
//            }
//
//            // try lock
//            RLock lock = get(key);
//            try {
//                if (!lock.tryLock(3, TimeUnit.SECONDS)) {
//                    return null;
//                }
//                // double check
//                result = test.apply(value);
//                if (result != null) {
//                    return result;
//                }
//
//                return ifLock.apply(value);
//            } catch (InterruptedException e) {
//                log.error("try to lock error, key is {}, value is {}", key, value);
//                Thread.currentThread().interrupt();
//            } finally {
//                //最后不要忘记手动释放锁，不要等着到expire time,不然会阻塞后面的方法运行
//                if(lock.isLocked() && lock.isHeldByCurrentThread()) {
//                    lock.unlock();
//                }
//            }
//
//            // if lock error
//            return null;
//        }
//    }
//
//    public static abstract class Zset {
//
//        public static <T> void add(String key, T value, double score) {
//
//            zset.add(key,value,score);
//        }
//
//        /**
//         * 获取所有数据
//         * @param key
//         * @return
//         */
//        public static java.util.Set<Object> getAll(String key) {
//            return zset.range(key,0,-1);
//        }
//
//        /**
//         * 分页查询
//         * @param key
//         * @return
//         */
//        public static java.util.Set<Object> page(String key,Integer start, Integer end) {
//            return zset.range(key,start,end);
//        }
//
//    }
//
//    /**
//     * Set operation - Set操作
//     */
//    public static abstract class Set {
//
//        public static <T> java.util.Set<T> getAll(String key, Class<T> t) {
//
//            return set.members(key).stream().map(x -> t.isInstance(x)?(T) x : null).collect(Collectors.toSet());
//
//        }
//
//        public static <T> List<T> getAllList(String key, Class<T> t) {
//            return set.members(key).stream().map(x ->  (T) x  ).collect(Collectors.toList());
//        }
//        /**
//         * Set.add
//         *
//         * @param key 哪一个map
//         * @author admin
//         */
//        public static <T> void add(String key, T value) {
//            set.add(key, value);
//        }
//
//        /**
//         * Set.addAll
//         *
//         * @param key 哪一个map
//         * @author fc
//         */
//        public static <T> void addAll(String key, Collection<T> value) {
//            value.forEach( t -> add(key,t));
//        }
//
//
//        /**
//         * Set.getAll
//         *
//         * @param key 哪一个map
//         * @author fc
//         * @return
//         */
//        public static java.util.Set<Object> getAll(String key) {
//            return set.members(key);
//        }
//
//        public static Long getSize(String key) {
//            return set.size(key);
//        }
//
//        /**
//         * Set.getAll
//         *
//         * @param key 哪一个map
//         * @author fc
//         * @return
//         */
//        public static void clear(String key) {
//            del(key);
//        }
//
//        public static void remove(String key,Object o) {
//            set.remove(key,o);
//        }
//
//        public static Boolean isMember(String key,Object o) {
//            return set.isMember(key, o);
//        }
//
//        /**
//         * Set.size
//         *
//         * @param key 哪一个map
//         * @author admin
//         */
//        public static <T> long size(String key, T value) {
//            return Optional.ofNullable(set.size(key)).orElse(0L);
//        }
//    }
//
//
//    /**
//     * Hash operation - Map操作
//     */
//    public static abstract class Hash {
//        private Hash() {
//        }
//
//        /**
//         * Map.inc
//         *
//         * @param key 哪一个map
//         * @author admin
//         */
//        public static double inc(String key, String member, double inc) {
//            return hash.increment(key, member, inc);
//        }
//
//        /**
//         * Map.getAll
//         *
//         * @param key 哪一个map
//         * @param t   泛型类
//         * @author admin
//         */
//        public static <T> Map<String, T> all(String key, Class<T> t) {
//            boolean needNumber = Number.class.isAssignableFrom(t);
//            return hash.entries(key).entrySet().stream()
//                    .filter(e -> e.getValue() != null && (t.isInstance(e.getValue()) || needNumber && Number.class.isInstance(e.getValue())))
//                    .collect(Collectors.toMap(Map.Entry::getKey, e -> ifNumber(t, e.getValue()), (v1, v2) -> v2));
//        }
//
//        /**
//         * Map.get
//         *
//         * @param key    哪一个map
//         * @param member map中的key
//         * @author admin
//         */
//        public static <T> T get(String key, String member, Class<T> t) {
//            Object value = hash.get(key, member);
//            return ifLong(t, value);
//        }
//
//        /**
//         * 如果是获取Long, 但redis中的默认值为Integer
//         *
//         * @param t     泛型类
//         * @param value 值
//         * @return T 泛型
//         * @author admin
//         */
//        private static <T> T ifLong(Class<T> t, Object value) {
//            return value == null ? null :
//                    t == Long.class ? (T) Long.valueOf(value.toString()) : t.isInstance(value) ? (T) value : null;
//        }
//
//        /**
//         * Map.get
//         *
//         * @param key     哪一个map
//         * @param members map中的keys
//         * @param t       泛型类
//         * @author admin
//         */
//        public static <T> Map<String, T> multiGet(String key, Collection<String> members, Class<T> t) {
//            if (members == null || members.isEmpty()) {
//                return Collections.emptyMap();
//            }
//
//            List<Object> list = hash.multiGet(key, members);
//            if (list.isEmpty()) {
//                return Collections.emptyMap();
//            }
//
//            Map<String, T> map = new HashMap<>();
//            int idx = 0;
//            for (String member : members) {
//                T o = ifLong(t, list.get(idx++));
//                if (t.isInstance(o)) {
//                    map.put(member, o);
//                }
//            }
//            return map;
//        }
//
//        /**
//         * Map.put
//         *
//         * @param key    哪一个map
//         * @param member map中的key
//         * @param value  map中的value
//         * @author admin
//         */
//        public static <V> void put(String key, String member, V value) {
//            hash.put(key, member, value);
//        }
//
//        /**
//         * Map.putAll
//         *
//         * @param key 哪一个map
//         * @param map 存入的map
//         * @author admin
//         */
//        public static <V> void putAll(String key, Map<String, V> map) {
//            hash.putAll(key, map);
//        }
//
//        /**
//         * 删除map中的元素
//         *
//         * @param key     哪一个map
//         * @param members map中的keys
//         * @author admin
//         */
//        public static void del(String key, String... members) {
//            if (members == null || members.length < 1) {
//                hash.delete(key);
//            }
//            hash.delete(key, (Object[]) members);
//        }
//
//
//        public static <T> List<T> values(String key, Class<T> t) {
//            return hash.values(key).stream().map(x ->  t.isInstance(x)?(T) x : null ).collect(Collectors.toList());
//        }
//
//        public static Boolean hasKey(String key, Object hasKey) {
//
//            return hash.hasKey(key,hasKey);
//
//        }
//    }
//
//    /***
//     * 是否存在该Key
//     * @param key
//     * @return
//     */
//    public static boolean haskey(String key) {
//        return redis.hasKey(key);
//    }
//
//    /***
//     * 将value存储到List中
//     * @param key
//     * @param value
//     */
//    public static void listLeftPush(String key, String value) {
//        list.leftPush(key, value);
//    }
//
//    /***
//     * 从List的右侧弹出vlaue
//     * @param key
//     * @return
//     */
//    public static String listRightPop(String key) {
//        return list.rightPop(key) != null ? list.rightPop(key).toString() : "";
//    }
//
//    /***
//     * list中个数
//     * @param key
//     * @return
//     */
//    public static long llen(String key) {
//        return list.size(key);
//    }
//
//    /***
//     * 从List集合左侧弹出
//     * @param key
//     * @return
//     */
//    public static String lpop(String key) {
//        return list.leftPop(key) != null ? list.leftPop(key).toString() : "";
//    }
//
//    /***
//     * 存储一个或多个元素到Set集合中
//     * @param key
//     * @param value
//     */
//    public static void setAdd(String key, String... value) {
//        set.add(key, value);
//    }
//
//
//    /***
//     * 判断元素是否存在Set集合中
//     * @param key
//     * @param value
//     * @return
//     */
//    public static boolean setIsMember(String key, String value) {
//        return set.isMember(key, value);
//    }
//
//}
